/**
 * 
 */
package compilador.analizadorSintactico.categoriasSintacticas;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import compilador.analizadorSemantico.tablaSimbolos.TablaSimboloSemantico;

/**
 * @author Nolberto Castellanos Rodriguez
 * @author Yurani Alejandra Salamanca Lotero
 *
 * Clase que representa el codigo fuente dentro de una clase
 */
public class Fuente {
	
//	-------------------------------------------------------------------------------------------------
//	ATRIBUTOS
//	-------------------------------------------------------------------------------------------------	

	/**
	 * Atributo que contiene los atributos de la clase
	 */
	private DeclaracionAtributos declaracionAtributos;
	
	/**
	 * Atributo que contiene los metodos de la clase
	 */
	private DeclaracionMetodos declaracionMetodos;
	
	
//	-------------------------------------------------------------------------------------------------
//	CONSTRUCTOR
//	-------------------------------------------------------------------------------------------------	

	/**
	 * Constructor que permite crear el codigo fuente de una clase
	 * @param declaracionAtributos. Los atributos de la clase a crear
	 * @param declaracionMetodos. Los metodos de la clase a crear
	 */
	public Fuente(DeclaracionAtributos declaracionAtributos, DeclaracionMetodos declaracionMetodos)
	{
		this.declaracionAtributos = declaracionAtributos;
		this.declaracionMetodos = declaracionMetodos;
		
	}
	
	/**
	 * @param ts
	 * @param errores
	 * @param claseActual
	 * @param metodoActual
	 */
	public void analizarSemantica(TablaSimboloSemantico ts,	ArrayList<SimboloError> errores, String claseActual, String metodoActual) {
		if(declaracionAtributos!= null)
			for (int i = 0; i < declaracionAtributos.getAtributos().size(); i++) {
				declaracionAtributos.getAtributos().get(i).analizarSemantica(ts, errores, claseActual, metodoActual);
			}
		
		if(declaracionMetodos != null)
			for (int i = 0; i < declaracionMetodos.getMetodos().size(); i++) {
				declaracionMetodos.getMetodos().get(i).analizarSemantica(ts, errores, claseActual, metodoActual);
			}
	}
	
//	-------------------------------------------------------------------------------------------------
//	METODOS
//	-------------------------------------------------------------------------------------------------	
	
	/**
	 * Metodo que permite agregar hojas al nodo de la clase
	 * @return el nodo de la clase con sus hojas
	 */
	public  DefaultMutableTreeNode getArbolVisual(){
		DefaultMutableTreeNode miRaiz =  new  DefaultMutableTreeNode("Fuente");
		if(declaracionAtributos!=null)
		{
			miRaiz.add(declaracionAtributos.getArbolVisual());
		}
		if(declaracionMetodos!=null)
		{
			miRaiz.add(declaracionMetodos.getArbolVisual());
		}
		
		return miRaiz;
	}


	
//	-------------------------------------------------------------------------------------------------
//	Getters & Setters
//	-------------------------------------------------------------------------------------------------	


	/**
	 * Metodo que nos retorna el valor de declaracionAtributos
	 * @return  declaracionAtributos. Valor retornado
	 */
	public DeclaracionAtributos getDeclaracionAtributos() {
		return declaracionAtributos;
	}


	/**
	 * Metodo que permite asignar el valor de declaracionAtributos
	 * @param declaracionAtributos. Valor a asignar declaracionAtributos
	 */
	public void setDeclaracionAtributos(DeclaracionAtributos declaracionAtributos) {
		this.declaracionAtributos = declaracionAtributos;
	}

	/**
	 * Metodo que nos retorna el valor de declaracionMetodos
	 * @return  declaracionMetodos. Valor retornado
	 */
	public DeclaracionMetodos getDeclaracionMetodos() {
		return declaracionMetodos;
	}

	/**
	 * Metodo que permite asignar el valor de declaracionMetodos
	 * @param declaracionMetodos. Valor a asignar declaracionMetodos
	 */
	public void setDeclaracionMetodos(DeclaracionMetodos declaracionMetodos) {
		this.declaracionMetodos = declaracionMetodos;
	}

	/**
	 * @return
	 */
	public String getJavaCode() {
		String retornable ="";
		if(declaracionAtributos != null)
			retornable += declaracionAtributos.getJavaCode();
		
		if(declaracionMetodos!= null)
			retornable += declaracionMetodos.getJavaCode();
		
		return retornable;
		
	}
	
}
